查看原文
其他

Oracle RAC 建设过程中必须应知、应做(上)

赵海 twt企业IT社区 2022-07-03

作者:赵海,某城商行系统架构师,专注并擅长银行数据中心解决方案规划及设计。目前在社区会员关注TOP100排行榜中名列第三位,社区专业技能榜6月综合排名中位列第二。


数据库建设过程中缺少可以遵循的实践标准,知识点和经验点散落四处难以快速形成逻辑性强的参照标准,面对项目令人无从下手。本文拟从各个层面进行总结和分析,为日后从事数据库建设的项目提供一个参考思路。

内容较长,作者将分为三部分撰写及发布。


原题:Oracle RAC建设过程中必须要知和要做的事情


1.背景描述
2.存储规划设计的关键点
3.网络规划设计的关键点

4.操作系统层的关键优化项
5.配置集群层的关键点
6.安装集群时的关键点

7.数据库层的关键优化项
8.总结及展望


1.背景描述

数据库建设是每一个企业数据中心建设过程中非常重要的一个环节,直接关系到业务连续性和稳定性。但是我们在数据库建设过程当中却很少有可以遵循的实践标准。当我们面对整个建设项目的规划设计和配置优化的时候,又觉得无从下手。散落在官方网站上的一些知识点和经验点无法让我们快速形成一个具有很强逻辑性的参照标准。本文希望通过以下篇幅的总结和分析,从各个层面给予实践标准,为日后从事数据库建设的项目提供一个参考思路。


2.存储规划设计的关键点

2.1 OCR/VOTE磁盘的合理规划事项

什么是OCR/VOTE磁盘,它在集群中是什么样的角色呢?

ORACLE RAC ASM管理模式下,磁盘组通常有三个(+DATA,+FRA,+OCR),在OCR磁盘组当中所有的磁盘中存储的数据包括两部分,一部分是Vote File,另外一部分就是OCR(Oracle Cluster Registry)。Vote File是用来记录集群节点的磁盘心跳信息,而OCR是保存集群配置信息的数据。Vote File,以整个文件的方式存储在OCR磁盘上,不做任何条带。下图是其信息记录的一个说明:

以上是一个三节点的ORACLE RAC集群的Vote FIle的一个示意矩阵,每一行是一个节点的写入的信息,例如第一行,Instance1分别把其对集群中的三个成员(1、2、3)进行私网检测的结果写入到仲裁文件当中,Instance2、Instance3同样把其检测结果写入仲裁文件,最终组成了三个节点的仲裁矩阵。当私网发生故障而从网络上导致集群分割为几个孤岛子集的时候,集群是通过这个文件的信息来判断最后存活的节点。具体算法有两个非常重要的规则:

1. 保障隔离后的集群子集中节点数目最多的子集存活。

2. 当隔离后的集群子集获得的仲裁票数相等时,保障实例号小者存活。

对于Vote File本身的数目来讲,Oracle又有一个非常重要的规则:集群节点获得的Vote File数目小于N/2+1时,节点就会被集群驱逐出集群,N是Vote File的总数目。也就是说集群中所有节点获得的Vote File数目必须要大于等于N/2+1。

根据以上结果来看,对于VOTE磁盘组的规划,首先偶数个仲裁磁盘必然会造成一个浪费。那么我们就没有必要选择偶数仲裁磁盘。然后我们再考虑磁盘组磁盘的容错能力,为了保障我们至少有1份磁盘容错能力,我们的仲裁磁盘至少是3块儿。也就是说对于OCR磁盘组的规划来讲,至少保障其内有三个容错组,每一个容错组里面一块儿仲裁磁盘。

对于OCR来讲,它属于集群的资源注册信息,是集群运行的前提条件。所以一定要保障它的高可用性。由于它属于配置数据,那么一定会遵循ORACLE ASM的磁盘冗余策略(External、Normal、High)。也就是说OCR在OCR磁盘组里面可以拥有1份、2份、3份镜像。每份镜像的数据条带会落在一个独立的容错组里。

综上所述,对于OCR磁盘组的规划,为了保障仲裁盘的至少一份的容错能力以及OCR数据的高冗余策略,我们应该至少将磁盘组内规划为3个磁盘,每一个磁盘落在一个独立的容错组。磁盘大小建议为1GB以上(虽然OCR Device = 300M左右)。

2.2 存储外部冗余架构设计

首先一定要用多路径软件对Lun进行路径管理,并且保障链路切换策略为负载均衡模式。对于链路的数目来讲最佳为8条链路。而且需要保证这8条链路在光纤口、光纤卡、接入交换机、核心交换机、存储控制器5个层面上的冗余。例如2张双口光纤卡,每个光纤卡通过各自接入交换机连接到不同的两个核心交换机上,核心交换机又分别与两个存储控制器的前端口相连接。在光纤交换机的zone配置里,每一个主机光纤口wwn和存储的一个前端口wwn配置在一个zone里面,端口比例为1:2,总共有8个zone。用示意图的方式表示如下:

2.3 NFS架构的存储配置参数

Orace RAC的ASM磁盘可以是网络存储架构实现的Lun,当然我们也可以利用文件系统或者裸盘作为数据库的存储资源。但是在挂载NFS卷的时候,有若干参数是值得我们注意的。

1)Hard/soft:当应用进程发送一个请求,Hard情况下,客户端遇到错误不会立即通知应用,而是在后台进行重试直到正常,这会导致应用进程的阻塞;Soft情况下,客户端会立刻通知应用导致应用挂起。从这个意义上来讲,Soft对应用的响应速度会比Hard好,但是如果网络不稳,那么Soft有可能导致应用数据被损坏。这也是Oracle建议将这个参数设置为Hard的理由。

2)Rsize/Wsize:客户端从服务器端读写文件的最大数目(byte)/每次请求。如果该参数不做设置的话,那么它是通过客户端和服务器端的协商完成的。一般建议设置为固定的32768。

3)Timeo: 建议为600(60秒)。

4)Intr/nointr: 是否允许接受文件操作的中断信号,一般而言设置为nointr。

5)Noac/ac: ac情况下,客户端会缓存文件属性信息,从而提高客户端的读性能。Noac情况下,客户端不会缓存文件属性信息,任何情况下的读都是NFS文件系统上文件的实时版本信息。Ac情况下,客户端会定期扫描Server端的文件实时信息,其他时候都是读取自己缓存的信息。NFS卷作为数据库的存储磁盘,只需要实时反映文件的真实版本信息即可,不需要客户端再去做缓存,数据库有自己的缓存机制。因此一般情况下Oracle建议将这个参数设置为Noac。

当然这些参数,根据不同的操作系统特点是会有一些差异。表2.3是摘自Oracle官方发布的NFS存储最佳实践参数表当中的一部分,可以提供通用参考。

2.4 ASM磁盘组规划

(1)磁盘组相关

除了OCR磁盘组之外,一般建议建立磁盘组不超过2个,一个是存放数据的数据磁盘组(+DATA),另外一个是存放日志的闪回区磁盘组(+FRA)。假设我们选择磁盘组的冗余策略为Normal,那么建议磁盘数目为偶数个并且至少为4个相同大小相同性能配置,一方面考虑到冗余为2份,另外一方面保障Failure Group里面数目的条带化分布,可以保障磁盘组的读写性能。如果是其他冗余策略,那么按照同样的思路去选择磁盘组的数目。另外Lun的大小不能超过2T(容易引起ORA-15196、ORA-15099问题)。

(2)磁盘分配单元及文件条带

AU是ASM Disk Group磁盘空间分配单元。Strip实际上是文件层面的条带,准确说法应该是文件的扩展块儿。对于文件的扩展块儿来讲就是文件切割的单元。它有两种模式(coarse & fine)。对于coarse模式来讲,扩展块儿大小等于AU大小,对应的参数固定不变(_asm_stripesize=AU,_asm_stripewidth=1)。对于fine模式来讲,扩展块儿大小是可以进行调整,根据我们的业务需求进行适当调整。例如设置为256K,那么原来1M的文件写在一个磁盘中的AU中,那么现在可以并行写入到赐个磁盘的4个AU当中。充分发挥了小IO的并行读写性能。但是对于某些大IO的数据库业务,那么AU可以适当调整到4M,同时启用操作系统的大页读写参数。文件扩展块儿可以保持corse模式。对于一般的OLTP业务来讲,数据文件、归档文件一般设置为corse;而redo日志、控制文件、flashback日志设置为fine。对于11g之后的oracle,这些参数基本不需要我们去主动调整,除非确实有性能问题与之相关。

2.5 ASM内存管理参数

(1)内存参数相关

 db_cache_size: 缓冲区,存放metadata块儿的buffer cache,建议值为64M。

 shared_pool: 管理ASM实例所需要的内存池,建议值为128M。

 Large_pool: 用来存储 extent maps,建议值为64M。

(2)其他参数相关

在11g当中,如果多个数据库共享ASM实例的话,那么建议按照以下规则计算process的数目设置。

ASM processes = 25 + (10 + max(可能的并发数据文件变化))* 数据库的数目。当然这个数目需要一个经验的评估,需要根据集群环境数据库的情况以及业务IO的判断来估算。

2.6 异步IO配置

一般来讲数据库应用都是要启用异步IO来提高数据库的IO性能。同时需要打开操作系统的异步IO参数和数据库的异步IO参数。以Linux为例,在操作系统层面需要设置参数 aio-max-nr=1048576(11g 中设置为 4194304),表示同时可以拥有的异步IO请求数目。然后在Oracle数据库层面设置以下两个参数:filesystemio_option=setall;disk_asynch_io=true。对于AIX来说,需要设置以下三个参数(aix_maxservers, aix_minservers,aio_maxreqs)对于OLTP业务来讲,IBM官方的建议值为(800,200,16384)。

以上的参数值只是一个通用的参考,但是以上所述的参数具体配置的值还是需要根据自己环境的数据来评估。比如我们需要关注iostat中的io等待情况和aio的一系列指标来判断设置值的科学与否。

2.7 ASMLib & Udev

对于Linux平台而言,Oracle RAC的ASM磁盘管理有三种方式(ASMlib、DM、udev),我们首选的方式是ASMlib,对于 RHEL6(从6.4开始),内核驱动软件包'kmod-oracleasm'已经在 Redhat 平台上启动,并且可以通过RedHat Network (RHN)上的"RHEL Server Supplementary (v. 6 64-bit x86_64)" 渠道进行安装。这个模块的更新将会由 RedHat 提供。

对于ASMlib的方式,它是通过以下命令方式创建ASM磁盘:

# /usr/sbin/oracleasm createdisk disk_name device_partition_name

通过这种方式创建的ASM磁盘组名称(disk_name),唯一绑定的是后面的device_partition_name,因此我们必须保障操作系统在日后的Lun变更过程中,这个命名是不能够变更的。假设我们用的是第三方多路径软件管理方式实现,那么需要通过多路径管理软件的方式来讲磁盘的device_partition_name和磁盘的唯一ID关联。例如emcpowerpath可以用emcadm export/import方式来保障Rac节点上的Lun名称一致。

对于udev的方式,同样道理我们需要将磁盘的scsi-id和最终形成的asm磁盘名称进行关联,而不是用磁盘在操作系统显示的设备名来关联。例如:

KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="36000c29a972d7d5fe0bf683b21046b34", NAME="asmgrid_disk1", OWNER="grid", GROUP="asmadmin", MODE="0660"

其中的PROGRAM字段非常重要,它表示我们是用什么方式来关联磁盘在操作系统和ASM之间的对应关系。如果在日后的运维过程中,随着磁盘的增减变化或者服务器的重启变更等导致了磁盘设备名发生变化,那么就会导致ASM磁盘符号紊乱,最终数据库集群无法启动。当然这个问题在11g之后就不存在了,因为11g之后ASM自动会去根据磁盘的唯一ID匹配ASM识别的磁盘ID,节点的读写是根据磁盘的ASM标示来执行的。但是从管理科学角度还是应该按照最佳实践来做从而保障没有任何风险。

2.8 AIX平台关注的存储参数

对于AIX平台而言,存储卷的系统参数必须遵循以下规则。

(1) reserve_lock、reserve_policy

该两个参数其实都是表示操作系统是否持有存储卷的共享锁方式。存储阵列类型为SSA, FAStT, 或者其他 non-MPIO-capable disks,参数设置参照A。存储阵列类型为SS, EMC, HDS, CLARiiON, 或者其他 MPIO-capable disks,参数设置方式参照B。

A. # chdev -l hdiskn -a reserve_lock=no 

B. # chdev -l hdiskn -a reserve_policy=no_reserve

(2) 磁盘在加入ASM磁盘组之前,必须清除其盘头PVID信息。否则就会导致ORA-15063、ORA-15040、ORA-15042等磁盘错误。

(3) fc_err_recov。

该参数表示因为AIX平台下光纤断掉场合下,读写错误切换的时间。正常情况下,这个切换会导致数据库IO挂起10分钟。如果是Vote disk,就会导致集群重启。为了避免此类情况发生需要把该参数的值设置为fast_fail,实现快速切换。

(4) max_transfer。

该参数建议设置最少为Oracle最大请求的IO大小,一般超过1M。

(5) queue_depth。

该参数表示Lun的最大IO队列深度,这个参数的设置必须足以支撑数据库并发读写的负载。

(6) max_xfer_size。

该参数表示光纤卡的最大传输大小,这个参数的设置必须与磁盘的吞吐参数保持倍数关系,并且必须大于磁盘设置的参数。

(7) num_cmd_elems。

该参数表示光纤卡接受的最大IO请求数目,这个参数同样与磁盘的queue_depth有着倍数关系,具体值的设定需要看环境当中光纤卡和其所容纳Lun的数目。


3.网络规划设计的关键点

3.1 硬件及参数

从Oracle官方的推荐来看,他们首先推荐使用万兆以太网,至少使用千兆以太网,负载如果很高那么私网可以采用infiniband。当然这个完全取决于客户生产环境的具体业务量及负载情况。这个仅仅是个参考,有条件的情况下可以按照推荐进行配置。私网的连接需要使用交换机,Oracle集群安装并不支持私网的直连架构。网卡及交换机的双攻击速率参数保持正确一致。

3.2 网卡绑定

各种平台都有自己的网卡绑定工具,而且提供负载均衡和主备模式的绑定。首先为了提高公网和私网的网络高可用,网卡需要绑定。对于Linux平台我们需要在配置文件 “/etc/modprobe.d/dist.conf” 中将数mode来控制网卡绑定的具体策略:

 mod=0,即:(balance-rr)Round-robin policy(平衡抡循环策略)。

 mod=1,即: (active-backup)Active-backup policy(主-备份策略)。

 mod=2,即:(balance-xor)XOR policy(平衡策略)。

 mod=3,即:broadcast(广播策略)。

 mod=4,即:IEEE 802.3ad Dynamic link aggregation(IEEE802.3ad 动态链接聚合)。

 mod=5,即:(balance-tlb)Adaptive transmit load balancing(适配器传输负载均衡)。

 mod=6,即:(balance-alb)Adaptive load balancing(适配器适应性负载均衡)。

对于私网网卡绑定方式mode=3&6会导致ORA-600,公网网卡绑定方式mode=6会导致BUG9081436。对于具体的绑定模式,对于平台版本低而且网络架构非常复杂的场合,还是建议主备模式,因为主备模式更稳定,不容易产生数据包路径不一致的问题。如果是负载均衡模式的场合,如果网络参数设置不是很科学的情况下,很容易出现从一个物理网卡发送报文,但是回报文却回到另外一个物理网卡上,网络链路再加入防火墙的规则之后,非常容易导致丢包问题发生。

而对于AIX平台来讲,将参数mode修改为NIB或者Standard值。Standard是根据目标IP地址来决定用哪个物理网卡来发送报文,是基于IP地址的负载均衡,也不易产生上述的丢包问题。

3.3 SCAN

Oracle RAC,从11gr2之后增加了SCAN(Single ClientAccess Name)的特性。

SCAN是一个域名,可以解析至少1个IP,最多解析3个SCAN IP,客户端可以通过这个SCAN 名字来访问数据库,另外SCAN ip必须与public ip和VIP在一个子网。启用SCAN 之后,会在数据库与客户端之间,添加了一层虚拟的服务层,就是SCAN IP和SCAN IP Listener,在客户端仅需要配置SCAN IP的tns信息,通过SCANIP Listener,连接后台集群数据库。这样,不论集群数据库是否有添加或者删除节点的操作,均不会对客户端产生影响,也就不需要修改配置。对于SCAN相关的配置,有以下一些配置注意事项:

(1)主机的默认网关必须与SCAN以及VIP在同一个子网上。

(2)建议通过 DNS,按round-robin方式将 SCAN 名称(11gR2 和更高版本)至少解析为 3 个 IP 地址,无论集群大小如何。

(3)为避免名称解析出现问题,假设我们设置了三个SCAN地址,那么HOSTs文件当中不能出现SAN的记录,因为HOSTs文件当中的记录是静态解析,与DNS动态解析相悖。

3.4 网络参数

操作系统平台上关于网络的内核参数非常重要,直接决定私网公网数据传输的稳定性和性能。不过针对不同的操作系统,相关的参数设置也各有差异。

1.Linux

对于Linux平台的内核参数,有两个非常重要(net.core.rmem_default、net.core.rmem_max)。具体功能解释如下:

 net.ipv4.conf.eth#.rp_filter:数据包反向过滤技术。

 net.ipv4.ip_local_port_range:表示应用程序可使用的IPv4端口范围。

 net.core.rmem_default:表示套接字接收缓冲区大小的缺省值。

 net.core.rmem_max:表示套接字接收缓冲区大小的最大值。

 net.core.wmem_default:表示套接字发送缓冲区大小的缺省值。

 net.core.wmem_max:表示套接字发送缓冲区大小的最大值。

为了获得更好的网络性能,我们需要根据具体情况把以上两个参数从其默认值适当调整为原来的2-3倍甚至更高,关闭或者设置反向过滤功能为禁用0或者宽松模式2。

2.AIX

对于AIX平台的内核参数,以下设置是从Oracle官方文档摘出的最佳配置:

tcp_recvspace = 65536;tcp_sendspace = 65536;

udp_sendspace = ((db_block_size *db_multiblock_read_count) + 4096) ;

udp_recvspace = 655360;

rfc1323 = 1;

sb_max = 4194304; 

ipqmaxlen = 512;

第1、2个参数表示TCP窗口大小,第3、4个参数表示UDP窗口大小。rfc1323启用由 RFC 1323(TCP 扩展以得到高性能)指定的窗口定标和时间图标。窗口定标允许 TCP 窗口大小(tcp_recvspace 和 tcp_sendspace)大于 64KB(65536)并且通常用于大的 MTU 网络。默认为0(关),如果试图将 tcp_sendspace 和 tcp_recvspace 设为大于 64 KB则需要先修改此值为1。ipqmaxlen 表示指定接收包的数目,这些包可以列在 IP 协议输入队列中。sb_max指定一个 TCP 和 UDP 套接字允许的最大缓冲区大小。

3.5 安全配置事项

1.Linux平台下的防火墙需要关闭,否则会引起公网或者私网的通讯问题。

# chkconfig iptables stop

2.Linux平台下的selinux安全配置项需要关闭,配置文件为/etc/security/config。

SELINUX=disabled

3.如果是Power System主机的PowerVM虚拟化架构下的AIX平台,如果发现Oracle RAC的两个节点之间有大量丢包现象或者是以下几种事件:

 Cache Fusion "block lost"

 IPC Send timeout

 Instance Eviction

 SKGXPSEGRCV: MESSAGE TRUNCATED user data nnnn bytes payload nnnn bytes

那么我们需要检查VIOS分区操作系统的补丁信息,如果没有APAR IZ97457,那么我们需要将这个补丁打上,详细需到IBM官网找到相应的补丁及其详细解释。

3.6 通用注意事项

1.系统主机名、域名等配置不允许有下划线。

2.网卡名称在两个节点上保持一致(例:public->eth1ð1,private->eth2ð2)。

3.网卡设备名称当中不能包含“.”等特殊字符。

4.私网地址需遵守RFC1918标准,采用其所规定的ABC三类企业内部私网地址。否则会引起BUG4437727发生。A类:10.0.0.0 -10.255.255.255 (10/8比特前缀); B类:172.16.0.0 -172.31.255.255 (172.16/12比特前缀); C类:192.168.0.0 -192.168.255.255 (192.168/16比特前缀)。而且私网VLAN需要与上述no-routeable子网之间需要是1:1的映射关系,以免引起BUG9761210。

5.从11gr2起,私网网段配置需要支持组播功能,因为私网需要通过组播模式实现通讯。

3.7 send (tx) / receive (rx)

UDP包传输的过程中,接受进程会读取数据包头的校验值。任何校验值损坏都会使这个包被丢弃,并导致重发,这会增加CPU的使用率并且延缓数据包处理。

由于网卡上开启了Checksum offloading 导致了checksum 错误,如果出现这样的问题请检查checksum offloading的功能是否被禁用,测试后考虑关闭网卡上的该项功能。在Linux系统上执行ethtool -K <IF> rx off tx off可以关闭该功能。

3.8 MTU

不匹配的MTU大小设置会导致传输过程中出现 "packet too big" 错误并丢失数据包,导致global cache block丢失和大量的重传(retransmission)申请。而且私网中不一致的MTU值会导致节点无法加入集群的问题。

对于以太网(Ethernet),大多数UNIX平台的默认值是1500字节。私网链路中所有设备都应该定义相同的MTU。请确认并监控私网链路中的所有的设备。为ping ,tracepath,traceroute命令指定大的,非默认尺寸,ICMP probe 包来检查MTU设置是否存在不一致。使用ifconfig或者厂商推荐的工具为服务器网卡(NIC)的MTU设置合适的值。

Jumbo Frames 并不是IEEE 标准配置。单个Jumb Frame的大小是9000 bytes左右。Frame 的大小取决于网络设备供应商,在不同的通信设备上的大小可能是不一致的。如果默认的MTU 尺寸不是9000bytes,请保证通信路径中的所有设备(例如:交换机/网络设备/网卡)都能够支持一个统一的MTU值,在操作的过程中必须把Frame Size(MTU Size)配置成这个值。不合适的MTU设置,例如:交换机上配置MTU=1500,但是服务器上的私网网卡配置成MTU=9000,这样会造成丢包,包的碎片和重组的错误,这些都会导致严重的性能问题和节点异常宕机。大部分的平台上我们都可以通过netstat –s命令的‘IP stats’输出发现包的碎片和重组的错误。大部分的平台上我们可以通过ifconfig –a命令找到frame size的设置。关于交换机上的配置查询,需要查看交换机提供商的文档来确定。


本文的中篇和下篇将在近期推出,敬请期待,您也可以关注作者的社区主页,获取最新动态

作者赵海社区个人主页:http://www.aixchina.net/home/space.php?uid=353923

本文地址:http://www.aixchina.net/Article/178289



(欢迎关注“社区专业技能榜”及“会员关注TOP100排行”,有助于你快速寻找感兴趣的专家、文章,甚至咨询疑难问题。点击公众号下部菜单中的“官网”,即可在子菜单中看到。)


长按下图二维码关注“AIX专家俱乐部”公众号

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存